package com.example.caorl.job5thread.op;

public class Join {
    
    public static void main(String[] args) {
        Object oo = new Object();
    
        MyThread thread1 = new MyThread("thread1 -- ");
        //oo = thread1;
        thread1.setOo(oo);
        thread1.start();
        
        synchronized (oo) {  // 这里用oo或thread1/this
//        synchronized (thread1) {  // 这里用oo或thread1/this
            for (int i = 0; i < 100; i++) {
                if (i == 20) {
                    try {
                        //synchronized进入后就不能释放锁，如果共用锁就会导致死锁
//                        oo.wait(4000); //当前线程释放 oo 对象锁，进入等待队列(notify或超时)。
//                        thread1.wait(4000); //当前线程释放 oo 对象锁，进入等待队列(notify或超时)。
                        thread1.join(); // 启动线程thread1(主线程会先释放锁？)，等待thread1执行完毕后再继续后面
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(Thread.currentThread().getName() + "=============" + i);
            }
        }
    }
    
}

class MyThread extends Thread {
    
    private String name;
    private Object oo;
    
    public void setOo(Object oo) {
        this.oo = oo;
    }
    
    public MyThread(String name) {
        this.name = name;
    }
    
    @Override
    public void run() {
        synchronized (oo) { // 使用oo，与主线程共用锁(共用锁，互相等待，造成了死锁)
//        synchronized (this) { // 使用this, 不与主线程公用锁（调用join后，MyThread先调用完然后再执行主线程）
            for (int i = 0; i < 100; i++) {
                System.out.println(name + i);
            }
        }
    }
    
}
/*
* sleep 不释放锁、释放cpu
* join 释放锁、抢占cpu
* yiled 不释放锁、释放cpu
* wait 释放锁、释放cpu
* */